﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using VemTransporte.Models.Negocio;
using VemTransporte.Models.Basica;

namespace VemTransporte.Models.Fachada
{
    public class Fachada
    {
        #region Atributos
        private ControladorTotal ctrlTotal;
        private IList<TipoTelefone> _TiposTelefones = null;
        private Empresa _EmpresaAtual = null;
        private Horario _Horario = null;
        private Horario _HorarioAlterar = null;
        private Linha _LinhaAtual;
        private LinhaParada _LinhaParadaAlterar;

        public LinhaParada LinhaParadaAlterar
        {
            get { return _LinhaParadaAlterar; }
            set { _LinhaParadaAlterar = value; }
        }
        private IList<Linha> _Linhas = null;
        private Linha _LinhaAlterar = null;
        private IList<Parada> _Paradas = null;

        public IList<Parada> Paradas
        {
            get { return _Paradas; }
            set { _Paradas = value; }
        }
        private Parada _ParadaAlterar = null;
        private Parada _Parada = null;
        #endregion

        #region Singleton
        /// 
        private static volatile Fachada _instance;

        /// <summary>
        /// Constructor private
        /// </summary>
        private Fachada()
        {
            ctrlTotal = new ControladorTotal();
        }

        public static Fachada Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (typeof(Fachada))
                    {
                        //Checa novamente
                        if (_instance == null)
                        {
                            _instance = new Fachada();
                        }
                    }
                }
                return _instance;
            }
            
        }
        #endregion

        #region Propriedades

        public Horario Horario
        {
            get { return _Horario; }
            set { _Horario = value; }
        }

        public Parada ParadaAlterar
        {
            get { return _ParadaAlterar; }
            set { _ParadaAlterar = value; }
        }


        public Linha LinhaAtual
        {
            get { return _LinhaAtual; }
            set { _LinhaAtual = value; }
        }

        public Empresa EmpresaAtual
        {
            get { return _EmpresaAtual; }
            set { _EmpresaAtual = value; }
        }

        public IList<Linha> Linhas
        {
            get { return _Linhas; }
            set { _Linhas = value; }
        }

        public Linha LinhaAlterar
        {
            get { return _LinhaAlterar; }
            set { _LinhaAlterar = value; }
        }

        public Parada ParadaAtual
        {
            get { return _Parada; }
            set { _Parada = value; }
        
        }

        public Horario HorarioAlterar
        {
            get { return _HorarioAlterar; }
            set { _HorarioAlterar = value; }
        }
        #endregion

        #region Usuario
        public void Salvar(Usuario u)
        {
            ctrlTotal.Salvar(u);
        }

        public void Remover(Usuario u)
        {
            ctrlTotal.Remover(u);
        }

        public Usuario ProcurarUsuarioPorId(int id)
        {
            return ctrlTotal.ProcurarUsuarioPorId(id);
        }

        public Usuario ProcurarUsuarioPorEMail(string email)
        {
            return ctrlTotal.ProcurarUsuarioPorEMail(email);
        }

        public Usuario ProcurarUsuarioPorEmailESenha(string email, string senha)
        {
            return ctrlTotal.ProcurarUsuarioPorEmailESenha(email, senha);
        }
        #endregion

        #region CEP
        public void Salvar(Endereco end)
        {
            ctrlTotal.Salvar(end);
        }

        public Endereco ProcurarEnderecoPorCep(string cep)
        {
            return ctrlTotal.ProcurarEnderecoPorCep(cep);
        }
        #endregion

        #region Empresa
        public void Salvar(Empresa e)
        {
            ctrlTotal.Salvar(e);
        }

        public void Alterar(Empresa e)
        {
            ctrlTotal.Alterar(e);
        }

        public Empresa ProcurarEmpresaPorEMailESenha(string email, string senha)
        {
            return ctrlTotal.ProcurarEmpresaPorEMailESenha(email, senha);
        }

        public IList<TipoTelefone> ProcurarTipoTelefoneTodos()
        {
            if ((_TiposTelefones == null) || (_TiposTelefones.Count == 0))
            {
                _TiposTelefones = ctrlTotal.ProcurarTipoTelefoneTodos();
            }
            return _TiposTelefones;
        }
        #endregion

        #region Linha
        public void Salvar(Linha l)
        {
            ctrlTotal.Salvar(l);
        }

        public void Remover(Linha l)
        {
            ctrlTotal.Remover(l);
        }

        public Linha ProcurarLinhaPorId(int idLinha)
        {
            return ctrlTotal.ProcurarLinhaPorId(idLinha);                
        }

        public Linha ProcurarLinhaPorNumero(string numero)
        {
            return ctrlTotal.ProcurarLinhaPorNumero(numero);
        }

        public IList<Linha> ProcurarLinhaTodos()
        {
            return ctrlTotal.ProcurarLinhaTodos();
        }        
        #endregion

        #region Horario
        public void Salvar(Horario h)
        {
            ctrlTotal.Salvar(h);
        }

        public void Remover(Horario h)
        {
            ctrlTotal.Remover(h);
        }

        public Horario ProcurarHorarioPorId(int id)
        {
            return ctrlTotal.ProcurarHorarioPorId(id);

        }

        public IList<Horario> ProcurarTodos()
        {
            return ctrlTotal.ProcurarTodos();
        }
        #endregion

        #region Parada
        public void Salvar(Parada p)
        {
            ctrlTotal.Salvar(p);
        }

        public Parada ProcurarParadaPorNumero(string numero)
        {
            return ctrlTotal.ProcurarParadaPorNumero(numero);
        }


        public IList<Parada> ProcurarParadaTodos()
        {
            this._Paradas = ctrlTotal.ProcurarParadaTodos();
            return this._Paradas;
        }

        public void Remover(Parada p)
        {
            ctrlTotal.Remover(p);
        }
        #endregion

        #region Localizacao
        public void Salvar(Localizacao l)
        {
            ctrlTotal.Salvar(l);
        }

        public Localizacao ProcurarUltimaLocalizacaoPorIdVeiculo(int id)
        {
            return ctrlTotal.ProcurarUltimaLocalizacaoPorIdVeiculo(id);
        }
        #endregion

        #region Veiculo
        public void Salvar(Veiculo v)
        {
            ctrlTotal.Salvar(v);
        }

        public void Remover(Veiculo v)
        {
            ctrlTotal.Remover(v);
        }

        public Veiculo ProcurarVeiculoPorId(int id)
        {
            return ctrlTotal.ProcurarVeiculoPorId(id);
        }

        public Veiculo ProcurarVeiculoPorPlaca(string placa)
        {
            return ctrlTotal.ProcurarVeiculoPorPlaca(placa);
        }
        #endregion

        #region Utils
        public string EncryptString(string Message)
        {
            return ctrlTotal.EncryptString(Message);
        }

        public string DecryptString(string Message)
        {
            return ctrlTotal.DecryptString(Message);
        }

        #endregion


    }
}